﻿package string;

public class 找到被指的新类型字符 {
	/**
	 * 正常的思路：从左到右一次划分出新类型字符
	 * 
	 * @param str
	 * @param k
	 * @return
	 */
	public static String getPointStr(String str, int k) {
		if (str == null || k > str.length())
			return null;
		String res = "";
		char[] chas = str.toCharArray();
		for (int i = 0; i <= k; i++) {
			if (chas[i] >= 'a' && chas[i] <= 'z') {
				// 如果是小写字母
				res = String.valueOf(chas[i]);
			}
			if (chas[i] >= 'A' && chas[i] <= 'Z') {
				res = String.valueOf(chas[i]) + chas[++i];
			}
		}
		return res;
	}

	/**
	 * 一种收敛更快的方法 从k-1位置开始，向左统计连续出现的大写字母的数量极为uNum
	 * 遇到小写字母就停止。如果uNum为奇数，str[k-1..k]是被指中的新类型字符
	 * 如果uNum是偶数且str[k]是大写字母，则str[k,k+1]是被指定的 如果uNum是偶数且str[k]是小写字母，则str[k]是被指定的
	 * 
	 * @param str
	 * @param k
	 * @return
	 */
	public static String pointNewChar(String str, int k) {
		if (str == null || str.length() < k || k < 0) {
			return null;
		}
		char[] chas = str.toCharArray();
		int uNum = 0;
		int index = k;
		while (index-- > 0) {
			if (chas[index] >= 'A' && chas[index] <= 'Z') {
				uNum++;
			} else {
				break;
			}
		}

		if (uNum % 2 == 1) {
			return String.valueOf(chas[k - 1]) + chas[k];
		}
		if (uNum % 2 == 0) {
			if (chas[k] >= 'A' && chas[k] <= 'Z') {
				return String.valueOf(chas[k]) + chas[k + 1];
			}
		}
		return String.valueOf(chas[k]);
	}

	public static void main(String[] args) {
		System.out.println(getPointStr("aaABCDEcBCg", 7));
		System.out.println(getPointStr("aaABCDEcBCg", 4));
		System.out.println(getPointStr("aaABCDEcBCg", 10));
		
		
		System.out.println(pointNewChar("aaABCDEcBCg", 7));
		System.out.println(pointNewChar("aaABCDEcBCg", 4));
		System.out.println(pointNewChar("aaABCDEcBCg", 10));
	}
}
